lst-sort-values、lst-apply-demo 与 lst-map-demo,完成排序、逐行计算和逐元素映射。read_csv 关键参数的使用方法loc 与 iloc 两种索引方式的区别query 查询方法apply 和 map 进行数据变换高质量数据的四个维度:
| 维度 | 含义 |
|---|---|
| 完整性 | 无缺失值或合理处理 |
| 一致性 | 格式统一,单位一致 |
| 准确性 | 值在合理范围内 |
| 唯一性 | 无重复记录 |
df、Trade_days、stock_price、df_asc 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd # 导入Pandas数据分析库
#将第一列(date)设置为索引,只读取指定的列usecols
df=pd.read_csv("https://huoran.oss-cn-shenzhen.aliyuncs.com/20230306/csv/1632645776084066304.csv",index_col=0,usecols=['date','syzg','zgpa','zgjz']).dropna()
Trade_days=df.shape[0] # 获取数据维度信息
print(f'2022年共有{Trade_days}个交易日') # 输出2022年共有
stock_price=df.loc['2022-03-01','zgjz'] # 按标签索引提取数据
print(f'3月第一个交易日中国建筑价格为{stock_price}元') # 输出3月第一个交易日中国建筑价格为
df_asc=df.sort_index(ascending=True) # 按索引排序
print(df_asc.head(8)) # 输出前几行数据运行后核对:核对 df、Trade_days、stock_price、df_asc 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。
index_col=0:将第一列(date)设为行索引
usecols=[...]:只加载指定列
.dropna():链式操作,读取后立即删除缺失值import pandas as pd # 导入Pandas用于构建和操作数据框
# 固定快照只承担索引教学,避免构建依赖失效的远程OSS链接
df = pd.DataFrame({ # 构建可离线重新运行的八个交易日教学快照
'date': pd.to_datetime(['2022-03-01', '2022-03-02', '2022-03-03', '2022-03-04',
'2022-03-07', '2022-03-08', '2022-03-09', '2022-03-10']),
'syzg': [27.52, 27.31, 26.76, 26.50, 25.98, 25.54, 24.92, 25.35],
'zgpa': [51.08, 50.82, 50.12, 49.80, 48.95, 48.36, 47.90, 48.41],
'zgjz': [5.39, 5.35, 5.30, 5.28, 5.20, 5.14, 5.09, 5.15]
}).set_index('date') # 将交易日期设为索引以演示时间序列检索
# 数据框形状
print(f'数据框形状: {df.shape}')
print(f' - 行数(交易日): {df.shape[0]}')
print(f' - 列数(股票): {df.shape[1]}')数据框形状: (8, 3)
- 行数(交易日): 8
- 列数(股票): 3
数据边界:该固定快照用于
loc、iloc、排序与筛选的离线教学,不用于收益率或投资结论;平台完整行情仍保留在受保护折叠块中。
索引类型: <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
索引范围: 2022-03-01 00:00:00 到 2022-03-10 00:00:00
列名(股票代码):
['syzg', 'zgpa', 'zgjz']
数据类型:
syzg float64
zgpa float64
zgjz float64
dtype: object
loc 使用标签(行名/列名)进行选择df.syzg > 20 返回布尔 Seriesloc 用这个布尔 Series 来筛选行iloc 使用整数位置进行选择| 特性 | loc |
iloc |
|---|---|---|
| 索引方式 | 标签(行名/列名) | 整数位置 |
| 切片末端 | 包含末端 | 不包含末端 |
| 适用场景 | 按日期/列名查询 | 按位置批量提取 |
| 示例 | df.loc['2022-03-01'] |
df.iloc[0] |
升序排序(日期从早到晚):
syzg zgpa zgjz
date
2022-03-01 27.52 51.08 5.39
2022-03-02 27.31 50.82 5.35
2022-03-03 26.76 50.12 5.30
降序排序(日期从晚到早):
syzg zgpa zgjz
date
2022-03-10 25.35 48.41 5.15
2022-03-09 24.92 47.90 5.09
先按syzg升序, 再按zgpa降序:
syzg zgpa zgjz
date
2022-03-09 24.92 47.90 5.09
2022-03-10 25.35 48.41 5.15
2022-03-08 25.54 48.36 5.14
2022-03-07 25.98 48.95 5.20
2022-03-04 26.50 49.80 5.28
df.syzg > 20 返回布尔 Series三一重工>20 且 中国平安>40:
syzg zgpa zgjz
date
2022-03-01 27.52 51.08 5.39
2022-03-02 27.31 50.82 5.35
三一重工>30 或 中国平安>45:
syzg zgpa zgjz
date
2022-03-01 27.52 51.08 5.39
2022-03-02 27.31 50.82 5.35
& 逻辑与(AND),| 逻辑或(OR)df[df.index.isin(dates_to_check)]syzg > 20:
syzg zgpa zgjz
date
2022-03-01 27.52 51.08 5.39
2022-03-02 27.31 50.82 5.35
2022-03-03 26.76 50.12 5.30
2022-03-04 26.50 49.80 5.28
2022-03-07 25.98 48.95 5.20
syzg > 20 and zgpa < 40:
Empty DataFrame
Columns: [syzg, zgpa, zgjz]
Index: []
@变量名:在 query 中引用 Python 环境变量每列的极差(最高价-最低价):
syzg 2.60
zgpa 3.18
zgjz 0.30
dtype: float64
每行的均值(每日三只股票平均):
date
2022-03-01 27.996667
2022-03-02 27.826667
dtype: float64
axis=0(默认):沿列方向操作axis=1:沿行方向操作(跨列计算)三一重工价格分类(前10个):
date
2022-03-01 中
2022-03-02 中
2022-03-03 中
2022-03-04 中
2022-03-07 中
2022-03-08 中
2022-03-09 中
2022-03-10 中
Name: syzg, dtype: object
map 只用于 Series,对每个元素逐个应用函数| 特性 | apply |
map |
|---|---|---|
| 适用对象 | DataFrame 或 Series | 仅 Series |
| 操作维度 | 按行或按列 | 逐元素 |
| 常见用途 | 聚合统计、跨列计算 | 值替换、分类映射 |
| 示例 | df.apply(func, axis=1) |
series.map(func) |
read_csv 的 index_col、usecols 等参数loc 按标签选择,切片包含末端iloc 按整数位置,切片不含末端sort_index 按索引,sort_values 按值&/|)与 query 方法apply 按行/列操作,map 逐元素操作lst-sort-values、lst-apply-demo 与 lst-map-demo,完成排序、逐行计算和逐元素映射。补充练习:下方结果须先以 sort_values('revenue', ascending=False) 得到相同的排序结果,再比较 map 的单列值映射与 apply(axis=1) 的多列行逻辑;拓展应用到长三角同季财报时用单调性、键集合与行数三项核对,未知状态不得静默填值。
所用数据与字段:表含 code、revenue
参考代码或推导(平台保护块之外):
import pandas as pd # 导入表格库
df=pd.DataFrame({'code':['A','A','B'],'revenue':[3,1,2]}) # 创建输入
status_map={'A':'重点','B':'观察'} # 定义单列值映射
answer=df.assign(status=df['code'].map(status_map)) # 用map逐元素映射代码
answer['scaled']=answer.apply(lambda row:row['revenue']*2 if row['status']=='重点' else row['revenue'],axis=1) # 用apply执行多列行逻辑
answer=answer.sort_values('revenue',ascending=False) # 按收入降序得到相同的排序结果
print(answer) # 输出结果[商业大数据分析与应用]